/*********************************************************************************
 *      Copyright:  (C) 2020 makun<1394987689@qq.com>
 *                  All rights reserved.
 *
 *       Filename:  memory_layout.c
 *    Description:  This file 
 *                 
 *        Version:  1.0.0(2020年03月05日)
 *         Author:  makun <1394987689@qq.com>
 *      ChangeLog:  1, Release initial version on "2020年03月05日 22时20分35秒"
 *                 
 ********************************************************************************/

#include <stdio.h>
#include <stdlib.h>

int g_var1; //g_var1是为未初始化的全局变量，存放在数据段的BSS区，其值默认为0；

int g_var2; //g_var2是初始化了的全局变量，存放在数据段的DATA区，其值为初始化值20

int main(int argc, char **argv)
{
    static int s_var1;//s_var1是未初始化的静态变量 ，存放在数据段的BSS区，其默认值为0

    static int s_var2=10;//s_var2是初始化的静态变量，存放在数据段的DATA区，其值为初始化值10

    char   *str="hello";//str是初始化了的局部变量，存放在栈(STACK)中，其值是"Hello"这个字符串常量存放在DATA段里RODATA区中的地址

    char   *ptr; //ptr是未初始化了的局部变量，存放在栈中，其值为随机值，这时候的ptr称为“野指针(为初始化的指针)"

    ptr = malloc(100); // malloc()会从堆(HEAP)中分配100个字节的内存空间，并将该内存空间的首地址返回给ptr存放；


    printf("[cmd args]: argv address: %p\n", argv);
    printf("\n");
    printf("[ Stack]: str address: %p\n", &str);
    printf("[ Stack]: ptr address: %p\n", &ptr);
    printf("\n");
    printf("[ Heap ]: malloc address: %p\n", ptr);
    printf("\n");
    printf("[ bss ]: s_var1 address: %p value: %d\n", &s_var1, g_var1);
    printf("[ bss ]: g_var1 address: %p value: %d\n", &g_var1, g_var1);
    printf("[ data ]: g_var2 address: %p value: %d\n", &g_var2, g_var2);
    printf("[ data ]: s_var2 address: %p value: %d\n", &s_var2, s_var2);
    printf("[rodata]: \"%s\" address: %p \n", str, str);
    printf("\n");
    printf("[ text ]: main() address: %p\n", main);
    printf("\n");
    
    return 0;
}
